/*
*    へ　　　　　  ／|
*    /＼7　　   ∠＿/
*    /　│　　 ／　／               
*    │　Z ＿,＜　／　　 /`ヽ     
*    │　　　　　ヽ　　 /　　〉    
*    Y　　　　　  `  /　　/     
*    ｲ ●　､　●　⊂⊃〈　　/       
*    ()  へ　　　　 |　＼       
*    >ｰ ､_　 ィ　 │ ／／        | @author:smily
*    / へ　　 /　ﾉ＜| ＼＼       | @project:net-hole
*    ヽ_ﾉ　　(_／　 │／／        | @file: NhSocket.h
*    7　　　　　　　|／          | @time: 2020/12/30 11:22
*====＞―r￣￣`ｰ―＿===========    
*^^^^^^^^^^^^^^^^^^^^^^^^^^^
*/

#ifndef NET_HOLE_NHSOCKET_H
#define NET_HOLE_NHSOCKET_H

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cerrno>
#include <fcntl.h>
#include <unistd.h>

class NhSocket {
public:
    NhSocket() = default;;

    ~NhSocket() = default;;

protected:
    int local_fd{}, server_fd{}, remote_fd{};
    struct sockaddr_in local_addr{}, server_addr{}, remote_addr{};
    char err_msg[256]{};
    int flags{};

public:
    //初始化socket环境，只调用一次
    bool init_socket();

    //获取错误信息
    char *get_err_msg() { return err_msg; };

    int get_local_fd() { return local_fd; };

    int get_server_fd() { return server_fd; };

    int get_remote_fd() { return remote_fd; };

    struct sockaddr_in get_local_addr() { return local_addr; };

    struct sockaddr_in get_server_addr() { return server_addr; };

    struct sockaddr_in get_remote_addr() { return remote_addr; };

    //创建本地socket
    bool create_local(unsigned int port);

    bool accept_link();

    bool connect_remote(struct sockaddr_in socket_addr, const char *ip, unsigned int port);

    bool recv_data(int socket_fd, char *buffer, int buffer_len, int &recv_len);

    bool send_data(int socket_fd, const char *data, int len);

    static void close_socket(int socket_fd) { close(socket_fd); };
};


#endif //NET_HOLE_NHSOCKET_H
